/*
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package java.lang;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

/**
 * 实现Iterable接口将允许对象成为"for-each loop"语句的目标,也就是允许对象实现for-each循环,也就是我们说的迭代器模式。
 * Implementing this interface allows an object to be the target of
 * the "for-each loop" statement. See
 * <strong>
 * <a href="{@docRoot}/../technotes/guides/language/foreach.html">For-each Loop</a>
 * </strong>
 *
 * @param <T> the type of elements returned by the iterator
 * 泛型<T> 是迭代器要返回的类型
 * @since 1.5
 * @jls 14.14.2 The enhanced for statement
 * 1.5 才出现了迭代器模式
 * 这样我们就可以用for(Object o : <Type> ? implement Iterable){}了,伪代码(pseudo code)。
 */
public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     * 包含所有T类型元素的迭代器
     * @return an Iterator.
     */
    Iterator<T> iterator();

    /**
     * Performs the given action for each element of the {@code Iterable}
     * until all elements have been processed or the action throws an
     * exception.  Unless otherwise specified by the implementing class,
     * actions are performed in the order of iteration (if an iteration order
     * is specified).  Exceptions thrown by the action are relayed to the
     * caller.
     * 除非抛出异常,否则给定一个函数行为去针对所有的Iterable迭代器元素执行,也就是让Iterable迭代器每个元素都受到action的副作用(变化、操作)。
     * 除非实现类另有规定,否则操作将按迭代顺序(一般是无序的)执行(如果指定了迭代顺序)。
     * 操作引发的异常将被转发给函数调用者(这也就是lambda debug难的一个地方)
     *
     * @implSpec
     * <p>The default implementation behaves as if:   默认实现的行为如下:
     * <pre>{@code
     *     for (T t : this)
     *         action.accept(t);
     * }</pre>
     *
     * @param action The action to be performed for each element
     *               action是为每个元素执行的操作()
     * @throws NullPointerException if the specified action is null
     * @since 1.8
     * forEach是1.8才添加的,它主要是配合lambda语法使用。 这里还使用了接口的默认方法(1.8)
     */
    default void forEach(Consumer<? super T> action) { //Consumer<? super T> 意味着我们的操作只能是T类型或者T类型的父类
        // 要保证操作不为空才行
        Objects.requireNonNull(action);
        //
        for (T t : this) {
            action.accept(t);
        }
    }

    /**
     * Creates a {@link Spliterator} over the elements described by this
     * {@code Iterable}.
     *
     * @implSpec
     * The default implementation creates an
     * <em><a href="Spliterator.html#binding">early-binding</a></em>
     * spliterator from the iterable's {@code Iterator}.  The spliterator
     * inherits the <em>fail-fast</em> properties of the iterable's iterator.
     *
     * @implNote
     * The default implementation should usually be overridden.  The
     * spliterator returned by the default implementation has poor splitting
     * capabilities, is unsized, and does not report any spliterator
     * characteristics. Implementing classes can nearly always provide a
     * better implementation.
     *
     * @return a {@code Spliterator} over the elements described by this
     * {@code Iterable}.
     * @since 1.8
     */
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
